from typing import List, Tuple

def _prompt_schema_description() -> List[str]:
    return ["""
你是neo4j数据库管理员，该数据库中存放了常州2024/01/01-2024/11/30的电视新闻报道数据，基本信息如下：

**数据Schema - Node Labels:**
- News: {{title: STRING, reported_on: STRING}}   // title - 新闻标题, reported_on - 新闻日期
- Reporter: {{id: STRING}} // id - 记者姓名
- Voiceover: {{id: STRING}} // id - 配音姓名
- Cameraman: {{id: STRING}} // id - 摄像姓名
- Description: {{id: STRING, content: STRING}} // id - 关联主键，content - 一句话描述新闻报道对象
- Entity: {{id: STRING, summary: STRING}} // id - 对象名称，可以是人名/地名/职位/公司名/角色等信息, STRING - 对该报道对象的总结说明

**数据Schema - 关系RelationShips** 
- (:Reporter)-[:COMPOSES]->(:News) 
- (:Voiceover)-[:COMPOSES]->(:News) 
- (:Cameraman)-[:COMPOSES]->(:News)
- (:News)-[:MENTIONS]->(:Description)
- (:Description)-[:MENTIONS]->(:Entity)

**额外约束**
- News.reported_on的时间格式为yyyy/MM/dd,比如 2024/04/05
- 仅使用给定的schema，不能扩展新的属性、节点或关系。
- 结果集:如果包含News数据，则按照`reported_on`字段，从新到旧排序，尽量用`DISTINCT`
- 不要输出推理过程，也不要输出无关信息
"""]

def _prompt_simple_introduce_schema() -> List[str]:
    return ["""
任务： 你是一个数据库管理员，负责一个包含常州市2024年1月1日至2024年11月30日电视新闻报道数据的数据库。你的任务是根据用户的查询，判断该查询属于以下哪一类。根据分类结果，输出相应的JSON格式回复。

数据库表信息：

News: 包含新闻标题（title）、报道日期（reported_on）、新闻内容（content）等字段。
Reporter: 记者的姓名（id）。
Voiceover: 配音员的姓名（id）。
Cameraman: 摄像师的姓名（id）。
Composes: 描述新闻与记者、配音员、摄像师等相关信息的关系。字段包括新闻条目ID（nid）和相应人员ID（pid）。
            
一篇新闻稿通常由一个或者多个记者、配音和摄像共同完成，新闻的标题，报道日期，以及对应的记者（Reporter）、播音（Voiceover）、摄像（Cameraman）等组成新闻元数据
"""]

def prompt_extract_entities() -> Tuple[List[str], List[str]]:
    return ["""
你是新闻编辑，擅长从一句话或者一个提问中，提取出实体名称和推导相关的日期作为查询条件，实体名称主要是地名、人名、角色名以及日期区间等信息。
            
**示例**
1. 陈金虎与沈磊去年三月份都拜访过的企业有哪些？   提取出： {{"entities": ['陈金虎', '沈磊'], "occurred_date_start": "2024/03/01", "occurred_date_end": "2024/03/31"}}
2. 常泰长江大桥最近有没有什么新闻报道？   提取出： {{"entities": ['常泰长江大桥'], "reported_date_start":"2024/10/01"}}
3. 常州奔牛国际机场航站区改扩建工程今年5月份以来的进展如何？   提取出： {{"entities": ['奔牛国际机场'], "occurred_date_start": "2024/05/01"}}
4. 截至去年3月15号，曹忠明都参加过哪些会议？   提取出： {{"entities": ['曹忠明'], "occurred_date_end":"2024/03/15"}}
5. 去年10月份，曹忠明在哪些新闻报道中出现过？   提取出： {{"entities": ['曹忠明'], "reported_date_start":"2024/10/01", "reported_date_end":"2024/10/30"}}

**提取说明**
1. 人物名字、提问中强调的角色需要提取出来，比如：市委书记参加过哪些会议？提取出：['市委书记']
2. 非重要的修饰名称，常见的名称则不需要提取，比如：市中级人民法院院长曹忠明参加的会议有哪些？提取出：['曹忠明']，而'中级人民法院院长'则不需要提取
3. 如果输入内容中包含日期，请注意提取开始和结束日期，对于“昨日”，“上个月”，“来年”等关键词进行理解并进行推敲,尽可能准确覆盖日期区间
4. 根据用户提问条件，请注意区分报道日期(reported_date)和实际发生日期(occurred_date)，选择合适的条件
5. 如果提问涉及是近期，则默认最近三个月内的时间根据当前日期倒推三个月的reported_date_start
6. 如果提问中没有明确表示具体日期信息，则reported_date_start、reported_date_end相关日期则为空
7. 所有的推断必须非常严谨，如果不是特别确定，则保留空值。
            
**输出格式**

{{"entities":[aa,bb,cc], "reported_date_start":"yyyy/MM/dd", "reported_date_end":"yyyy/MM/dd", "occurred_date_start":"yyyy/MM/dd", "occurred_date_end":"yyyy/MM/dd"}}

- entities: 提问内容中包含的核心人物、地点、事件、地标等具体名称的列表，可以一个或者多个
- occurred_date_start:事件开始日期（可选）
- occurred_date_end:事件结束日期（可选）
- reported_date_start:新闻报道开始的日期（可选）
- reported_date_end:新闻报道结束的日期（可选）            
""",
"""假设今天日期为：{date_time}，请给出推理时间的思考过程"""
], ["date_time"]

def prompt_cypher() ->  Tuple[List[str], List[str]]:
    return _prompt_schema_description() + ["""
**示例**
- 任务描述：陈金虎书记今年10月份的公开报道有哪些  Cypher Statement: MATCH (n: News) -[:MENTIONS] -> (d: Description) -[:MENTIONS]->(p: Entity) WHERE p.id CONTAINS '陈金虎' AND n.reported_on >= '2024/10/01" and n.reported_on <= '2024/10/31' RETURN DISTINCT n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：近三年常泰大桥的工程进展情况？  Cypher Statement: MATCH (n: News) -[:MENTIONS] -> (d: Description) -[:MENTIONS]->(p: Entity) WHERE p.id CONTAINS '常泰大桥' AND n.reported_on >= '2021/12/20" and n.reported_on <= '2024/12/20' RETURN DISTINCT n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：新闻标题中包含恐龙园的稿子有哪些？  Cypher Statement: MATCH (n: News) WHERE n.title CONTAINS '恐龙园' RETURN n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：今年3月5号的新闻有哪些？  Cypher Statement: MATCH (n: News) WHERE n.reported_on='2024/03/05' RETURN n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：刘瑞和王五合作报道过的新闻  Cypher Statement: MATCH (p1) -[:COMPOSES]->(n: News)<- [:COMPOSES] - (p2) WHERE p1.id = '刘瑞' AND p2.id='王五' RETURN n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：刘瑞担任过摄像吗？  Cypher Statement: MATCH (p: Camareman) -[:COMPOSES]->(n: News) WHERE p.id='刘瑞' RETURN n.title, n.reported_on ORDER BY n.reported_on DESC LIMIT 50
- 任务描述：刘五报道的常泰长江大桥新闻  Cypher Statement: MATCH (p: Reporter) -[:COMPOSES]->(n: News) -[:MENTIONS] -> (d: Description) -[:MENTIONS] -> (e:Entity) WHERE e.id CONTAINS '常泰长江大桥' and p.id='刘五' RETURN distinct d.content, n.reported_on ORDER BY n.reported_on DESC LIMIT 50

**额外要求**，请认真思考
- 尽量不要和和News.title字段做条件匹配，因为title包含的关键词太少，除非任务描述中强烈暗示
- 尽量和News.content字段做条件匹配，但不要返回 News.content 字段内容，因为News.content字段内容太长，容易导致信息过度冗余
- 默认返回结果集控制在50个以内,如果返回News.content字段内容，结果集不能超过1条记录
- 涉及具体日期，用"yyyy/MM/dd","yyyy/MM"或者"yyyy"格式
- News.content的条件匹配，尽量用'CONTAINS' 不要用'='

今天的日期是{date_time}, 请输出Cypher
"""], ["date_time"]

def prompt_categorize() -> Tuple[List[str], List[str]]:
    return _prompt_simple_introduce_schema() + [ 
"""
=== 上下文如下 ===
{context}
===
""",
"""
不需要你回答该问题的答案，只需要将该问题进行如下分类：

# 分类1：与新闻元数据查询相关的查询或者聚合统计
- 描述：查询新闻中涉及的元数据信息，包括记者、配音师、摄像师、新闻标题等内容。
- 示例：
记者刘瑞和配音师王五合作报道过多少篇新闻？
和记者刘瑞及配音师王五合作报道过新闻的摄像有哪些人？
和记者刘瑞去年5月报道的新闻标题有哪些？

# 分类2：被报道对象的基本信息查询
- 描述：查询新闻中提到的具体对象（如人物、地点、事件等），获取这些对象的详细基本信息。包括公众人物、著名景点、重大工程、重要地标、高级别领导等。
- 示例：
介绍一下常泰大桥
介绍一下恐龙园
陈金虎是谁
介绍盛蕾
介绍现代传媒中心

#分类3：总结性提问
- 描述：针对人物、景点、地标、领导、重大工程、重要事件等的总结性问题。
- 示例：
罗列一下常泰大桥的建设进展
说一说常州恐龙园近三个月举办的活动集会
常州现代传媒中心的过去和现在

# 分类4：其它问题
- 描述：不属于上述任何一种类型的问题。

# 输出：
输出内容为针对用户提问分类，以JSON格式输出，比如{{"category": 1}}。

""",
"""当前日期是{date_time}"""
], ["context", "date_time"]

